#ifndef __ESP01S_CONTROL_H
#define __ESP01S_CONTROL_H

#include "stm32f10x.h" 
#include "freertos.h"
#include "task.h"

#include <string.h>  // strcmp()
#include <stdint.h>  // uint8_t
//#include <stdlib.h>  // itoa()

#include "USART_Config.h"
#include "Buzzer_Init.h"
#include "OLED.h"

#define MAX_MSG_LEN 256

// 状态表
typedef enum {
    ESP_STATE_IDLE = 0,        // 初始状态
    ESP_STATE_STA_MODE,    	   // 设置STA模式
    ESP_STATE_WIFI_CONNECT,    // 连接WiFi
    ESP_STATE_TCP_CONNECT,     // 连接TCP服务器
    ESP_STATE_TX_PREPARE,      // 准备发送数据
    ESP_STATE_TRANSPARENT,     // 透传模式
    ESP_STATE_EXIT_TRANSPARENT,// 退出透传(+++)
    ESP_STATE_TX_STOP,         // 关闭发送模式
    ESP_STATE_TCP_DISCONNECT,  // 关闭TCP连接
    ESP_STATE_DEINIT           // 结束状态
} esp_state_t;

// 指令表
static const struct {
    const char* cmd;           // AT指令
    uint8_t len;               // 指令长度（避免运行时计算）
    esp_state_t next_state;    // 执行成功后的下一个状态
} at_espcmds[] = {
    // 启动序列
	{"AT\r\n", 4, ESP_STATE_STA_MODE},
	{"AT+CWMODE_DEF=1\r\n", 17, ESP_STATE_WIFI_CONNECT},
	{"AT+CWJAP_DEF=\"yang\",\"12345678\"\r\n", 32, ESP_STATE_TCP_CONNECT},
	{"AT+CIPSTART=\"TCP\",\"47.111.20.8\",9080\r\n", 38, ESP_STATE_TX_PREPARE},
	{"AT+CIPMODE=1\r\n", 14, ESP_STATE_TRANSPARENT},
    
    // 退出序列
    {"+++", 3, ESP_STATE_TX_STOP},
    {"AT+CIPMODE=0\r\n", 14, ESP_STATE_TCP_DISCONNECT},
    {"AT+CIPCLOSE\r\n", 12, ESP_STATE_DEINIT},
    
    // 结束标记
    {NULL, 0, ESP_STATE_DEINIT}
};

// 全局状态变量声明
//extern volatile uint8_t ESP_index;
//extern volatile esp_state_t ESP_state;

void ESP_AutoConnect(void);
void ESP_StateTransition(char *resp);
const char* ESP_StateToString(esp_state_t state);
void ESP_SendPacket(void);
void vTask_ESP01s_Heartbeat(void *arg);
	
#endif
